package com.choichumgming.rentcat.service.Impl;


import com.choichumgming.rentcat.mapper.PmsProductMapper;
import com.choichumgming.rentcat.model.PmsProduct;
import com.choichumgming.rentcat.model.PmsProductExample;
import com.choichumgming.rentcat.service.UmsMemberFeignApi;
import com.choichumgming.rentcat.domain.PmsProductQueryParam;
import com.choichumgming.rentcat.service.PmsProductService;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;

/**
 * 商品管理Service实现类
 */
@Slf4j
@Service
public class PmsProductServiceImpl implements PmsProductService {
    private static final Logger LOGGER = LoggerFactory.getLogger(PmsProductServiceImpl.class);
    @Autowired
    private PmsProductMapper productMapper;

    @Autowired
    private UmsMemberFeignApi umsMemberFeignApi;

    /**
     * @Description : 创建商品
     * ps：商品的图片已经在前端直接上传到了oss，然后前端直接返回图片视频的url
     * @param product
     * @Return : int
     * @Author : choichumgming
     * @Date : 27/2/2020 22:34
    */
    @Override
    public int create(PmsProduct product) {
        int count;
//        要获得当前用户的ID
//        UmsMember umsMember = umsMemberFeignApi.getCurrentUser().getData();
//        product.setUserId(umsMember.getUserId());
        //创建商品
        product.setProductId(null);
        product.setPublishStatus(1);
        product.setRentStatus(0);
        int productId = productMapper.insert(product);
        return productId;
    }




    /**
     * @Description : 更新商品
     *      * ps：商品的图片已经在前端直接上传到了oss，然后前端直接返回图片视频的url
     *
     * @param productId
     * @param product
     * @Return : int
     * @Author : choichumgming
     * @Date : 27/2/2020 22:25
    */
    @Override
    public int update(Long productId, PmsProduct product) {
        int count;
        //更新商品信息
        product.setProductId(productId);

        productMapper.insertSelective(product);
        productMapper.updateByPrimaryKeySelective(product);

        count = 1;
        return count;
    }

    @Override
    public PmsProduct getProduct(Long productId){
        return productMapper.selectByPrimaryKey(productId);
    }
    /**
     * @Description : 更新商品状态 上架状态：0->下架；1->上架
     *
     * @param id
     * @param publishStatus
     * @Return : int
     * @Author : choichumgming
     * @Date : 27/2/2020 22:26
    */

    @Override
    public int updateProductPublishStatus(Long id, Integer publishStatus){
        PmsProduct record = new PmsProduct();
        record.setPublishStatus(publishStatus);
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andProductIdEqualTo(id);
        return productMapper.updateByExampleSelective(record, example);
    }


    /**
     * @Description : 获得指定用户的闲置列表
     *
     * @param userId
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 27/2/2020 22:28
    */
    @Override
    public List<PmsProduct> getUserProductList(Long userId) {
        PmsProduct record = new PmsProduct();
        record.setUserId(userId);
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andUserIdEqualTo(userId);
        return productMapper.selectByExample(example);
    }

    /**
     * @Description : 单个修改商品出租状态 租赁状态：0->未出租；1->已出租
     *
     * @param id
     * @param rentStatus
     * @Return : int
     * @Author : choichumgming
     * @Date : 27/2/2020 22:28
    */
    @Override
    public int updateRentStatus(Long id, Integer rentStatus) {
        PmsProduct record = new PmsProduct();
        record.setRentStatus(rentStatus);
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andProductIdEqualTo(id);
        return productMapper.updateByExampleSelective(record, example);
    }

    /**
     * @Description : 根据商品名称或者货号模糊查询
     *
     * @param productQueryParam
     * @param pageSize
     * @param pageNum
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 27/2/2020 22:29
    */

    @Override
    public List<PmsProduct> list(PmsProductQueryParam productQueryParam, Integer pageSize, Integer pageNum) {
        PageHelper.startPage(pageNum, pageSize);
        PmsProductExample productExample = new PmsProductExample();
        PmsProductExample.Criteria criteria = productExample.createCriteria();

        if (productQueryParam.getPublishStatus() != null) {
            criteria.andPublishStatusEqualTo(productQueryParam.getPublishStatus());
        }

        if (!StringUtils.isEmpty(productQueryParam.getKeyword())) {
            criteria.andNameLike("%" + productQueryParam.getKeyword() + "%");
        }

        if (productQueryParam.getProductCategoryId() != null) {
            criteria.andProductCategoryIdEqualTo(productQueryParam.getProductCategoryId());
        }
        return productMapper.selectByExample(productExample);
    }


    /**
     * @Description : 批量修改商品上架状态
     *                在前端界面，可以通过批量选中修改状态
     * @param ids
     * @param publishStatus
     * @Return : int
     * @Author : choichumgming
     * @Date : 27/2/2020 22:29
    */

    @Override
    public int updateProductsPublishStatus(List<Long> ids, Integer publishStatus) {
        PmsProduct record = new PmsProduct();
        record.setPublishStatus(publishStatus);

        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andProductIdIn(ids);
        int result = productMapper.updateByExampleSelective(record, example);
        log.warn(result+"");
        return result;
    }


    /**
     * @Description : 批量删除商品
     * 在前端界面，可以通过批量选中删除商品
     * @param ids
     * @Return : int
     * @Author : choichumgming
     * @Date : 27/2/2020 22:32
    */
    @Override
    public int delete(List<Long> ids ) {
        PmsProduct record = new PmsProduct();
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andProductIdIn(ids);
        for(Long productId: ids){
            productMapper.deleteByPrimaryKey(productId);
        }
        return 1;
    }

    /**
     * @Description : 关键词搜索
     *
     * @param keyword
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 27/2/2020 22:33
    */

    @Override
    public List<PmsProduct> list(String keyword) {
        PmsProductExample productExample = new PmsProductExample();
        PmsProductExample.Criteria criteria = productExample.createCriteria();
        if(!StringUtils.isEmpty(keyword)){
            criteria.andNameLike("%" + keyword + "%");
        }
        return productMapper.selectByExample(productExample);
    }


    /**
     * 建立和插入关系表操作
     *
     * @param dao       可以操作的dao
     * @param dataList  要插入的数据
     * @param productId 建立关系的id
     */
    private void relateAndInsertList(Object dao, List dataList, Long productId) {
        try {
            if (CollectionUtils.isEmpty(dataList)) return;
            for (Object item : dataList) {
                Method setId = item.getClass().getMethod("setId", Long.class);
                setId.invoke(item, (Long) null);
                Method setProductId = item.getClass().getMethod("setProductId", Long.class);
                setProductId.invoke(item, productId);
            }
            Method insertList = dao.getClass().getMethod("insertList", List.class);
            insertList.invoke(dao, dataList);
        } catch (Exception e) {
            LOGGER.warn("创建产品出错:{}", e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * @Description : 随机获得带有Video的商品
     *
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 11/3/2020 11:32
    */
    @Override
    public List<PmsProduct> getProductsWithVideo() {
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andVideoIsNotNull();

        List<PmsProduct> productList = productMapper.selectByExample(example);
//        打乱list内元素的排序，造成随机性
        Collections.shuffle(productList);
        return productList;
    }

    /**
     * @Description : 任选100条首页推荐
     *
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 12/3/2020 23:39
    */
    @Override
    public List<PmsProduct> getHomeProductList() {
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andNameIsNotNull();
        List<PmsProduct> productList = productMapper.selectByExample(example);
        //        打乱list内元素的排序，造成随机性
        Collections.shuffle(productList);
        return productList;
    }

    /**
     * @Description : 获得展示页信息
     *
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 13/3/2020 10:20
    */

    @Override
    public List<PmsProduct> getBannnerList() {
        PageHelper.startPage(1,10);
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andAlbumPicsIsNotNull();
        List<PmsProduct> productList = productMapper.selectByExample(example);
        return productList;
    }

    /**
     * @Description : 功能说明
     *
     * @param categoryId
     * @Return : java.util.List<com.choichumgming.rentcat.model.PmsProduct>
     * @Author : choichumgming
     * @Date : 14/3/2020 12:38
    */
    @Override
    public List<PmsProduct> getProductListByCategoryId(Long categoryId, int  pageNum, int pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        PmsProductExample example = new PmsProductExample();
        example.createCriteria().andProductCategoryIdEqualTo(categoryId);
        List<PmsProduct> productList = productMapper.selectByExample(example);
        return productList;

    }
}
